function [x, fx, exitflag, output] = puntofisso(f, g, x0, options, varargin)
    % sepzeri   Ricerca sottointervalli con variazione di segno di f(x)
    %
    % Sintassi: Xrad
    % Impostazioni di default
    if nargin < 4
        xtol = 1e-15; ftol = 1e-15; maxiter = 100;
        verbose = false;
    else
        xtol = options.xtol; ftol = options.ftol;
        maxiter = options.maxiter; verbose = options.verbose;
    end
    
    
    
    
    % Inizializzazione variabili d'uscita
    x = []; fx = []; exitflag = -1;
    output = struct('iter', [], 'x_k', [], 'fx_k', []);
    
    % Definisco la funzione delle secanti
    f_puntofisso = inline('g(x_k)', 'x_k', 'g');
    
    % Re-imposta le tolleranze se troppo piccole
    xtol = max(xtol, 5*eps);
    ftol = max(ftol, 5*eps);
    
    
    % Vettore delle x
    x_k = repmat(NaN, 1, maxiter);
    fx_k = repmat(NaN, 1, maxiter);
    
    % iterazione corrente
    iter = 1;
    
    % Valuto x(0)
    x_k(1) = x0;
    fx_k(1) = f(x0);
    
    
    % Costanti per il test di convergenza
    %xref 
    %fref = max(abs([fa, fb]));
    
    
    % Output viene valutata solo se necessario
    if nargout == 4
        output.iter = 0;
        output.x_k = NaN(1, maxiter);
        output.fx_k = NaN(1, maxiter);
        
        output.x_k(1)=x0;
        output.fx_k(1)=f(x0);
    end
    
    % Stampa informazioni se disponibili
    if verbose
        fprintf('%30s\n%4s %12s %12s\n%30s\n', ...
            repmat('-', 1, 30), 'iter', 'x_k', 'f(x_k)', repmat('-', 1, 30));
    end
    
    % Ciclo principale di convergenza
    while iter <= maxiter
        
        % Aggiorno contatore delle iterazioni
        iter = iter + 1;
        
        % trovo la x_(k+1)
        x_k(iter) = f_puntofisso(x_k(iter-1), g);
        
        % Valuto la funzione
        fx_k(iter) = feval(f, x_k(iter), varargin{:});
        
        % Salvataggio informazioni se richieste
        if nargout == 4
            output.iter = iter-1;
            output.x_k(iter) = x_k(iter);
            output.fx_k(iter) = fx_k(iter);
        end
        
        % Stampa informazioni se disponibili
        if verbose
            fprintf('%4d %12.4e %12.4e \n', iter-1, x_k(iter), fx_k(iter));
        end
        
        % Test di convergenza
        if (abs( x_k(iter-1) - x_k(iter) )/abs(x_k(1)) < xtol)
            % Trovata radice ed esci dal ciclo
            x = x_k(iter);
            fx = fx_k(iter);
            exitflag = 1;
            break;
        end
        
        
    end
    
    % Sistemazione dell'output finale
    if nargout == 4
        output.x_k = output.x_k(1:output.iter);
        output.fx_k = output.fx_k(1:output.iter);
    end
    
    if verbose
        fprintf('%30s\n', repmat('-', 1, 30));
    end
end

